package com.feifan.monthhelper.utils;

import android.support.annotation.IntDef;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import static com.feifan.monthhelper.utils.DateUtils.DATE_MODE.MILLISECOND;
import static com.feifan.monthhelper.utils.DateUtils.DATE_MODE.SECOND;

public class DateUtils {

    @IntDef({MILLISECOND, SECOND})
    public @interface DATE_MODE {
        int MILLISECOND = 1;
        int SECOND = 2;
    }

    private int timeMultiple;

    private DateUtils(@DATE_MODE int dataMode) {
        switch (dataMode) {
            case MILLISECOND:
                timeMultiple = 1;
                break;
            case DATE_MODE.SECOND:
                timeMultiple = 1000;
                break;
        }
    }

    public static DateUtils init() {
        return new DateUtils(SECOND);
    }

    public static DateUtils init(@DATE_MODE int dataMode) {
        return new DateUtils(dataMode);
    }

    /**
     * 获取SimpleDateFormat
     *
     * @param parttern 日期格式
     * @return SimpleDateFormat对象
     */
    private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
        return new SimpleDateFormat(parttern);
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date      日期
     * @param dateStyle 日期风格
     * @return 日期字符串
     */
    public String dateToString(Date date, DateStyle dateStyle) {
        String dateString = null;
        if (dateStyle != null) {
            dateString = dateToString(date, dateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 将时间戳转化为日期字符串。失败返回null。
     *
     * @param time      时间戳
     * @param dateStyle 日期风格
     * @return 日期字符串
     */
    public String longToTime(long time, DateStyle dateStyle) {
        String dateString = null;
        if (dateStyle != null) {
            dateString = dateToString(createDate(time), dateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date 日期
     * @return 日期字符串
     */
    private static String dateToString(Date date, String parttern) {
        String dateString = null;
        if (date != null) {
            try {
                dateString = getDateFormat(parttern).format(date);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return dateString;
    }

    /**
     * 时间戳转换为yyyy.MM.dd格式时间
     */
    public String longToTime(long t) {
        String time;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
        Date date = createDate(t);
        time = sdf.format(date);
        return time;
    }

    /**
     * 时间戳转换为yyyy-MM-dd HH:ss:mm
     */
    public String longToStrTime(long t) {
        String time;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = createDate(t);
        time = sdf.format(date);
        return time;
    }

    public String longToFormTime(long t) {
        String time;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        Date date = createDate(t);
        time = sdf.format(date);
        return time;
    }

    /**
     * 时间戳转换为yyyy年MM月dd日格式时间
     */
    public String getMsgTime(long t) {
        String time;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = createDate(t);
        time = sdf.format(date);
        return time;
    }

    /**
     * 根据时间长度得到long（毫秒）
     */
    public long timeLengthToLong(int minute, int second) {
        return minute * 60 * 1000 + second * 1000;
    }

    /**
     * 根据时间长度得到long（毫秒）
     */
    public long StringToLong(String dateString, DateStyle dateStyle) {
        SimpleDateFormat formatter = new SimpleDateFormat(dateStyle.getValue());
        Date date = null;
        try
        {
            date = formatter.parse(dateString);
            return date.getTime();
        } catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 根据时间长度得到date
     */
    public Date StringToDate(String dateString, DateStyle dateStyle) {
        SimpleDateFormat formatter = new SimpleDateFormat(dateStyle.getValue());
        Date date = null;
        try
        {
            return formatter.parse(dateString);
        } catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return new Date();
        }
    }

//    /**
//     * 日期字符串转date
//     * @param dateString 目标日期字符串
//     * @return data
//     */
//    public long StringToCal(String dateString, DateStyle dateStyle) {
//        SimpleDateFormat formatter = new SimpleDateFormat(dateStyle.getValue());
//        Date date = null;
//        try
//        {
//            date = formatter.parse(dateString);
//            return date.getTime();
//        } catch (ParseException e)
//        {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//            return 0;
//        }
//    }

    private Date createDate(long date) {
        return new Date(date * timeMultiple);
    }

    /**
     * Date格式
     */
    public static enum DateStyle {

        MM_DD("MM-dd"),
        YYYY_MM("yyyy-MM"),
        YYYY_MM_DD("yyyy-MM-dd"),
        MM_DD_HH_MM("MM-dd HH:mm"),
        MM_DD_HH_MM_SS("MM-dd HH:mm:ss"),
        YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"),
        YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"),

        MM_DD_EN("MM/dd"),
        YYYY_MM_EN("yyyy/MM"),
        YYYY_MM_DD_EN("yyyy/MM/dd"),
        MM_DD_HH_MM_EN("MM/dd HH:mm"),
        MM_DD_HH_MM_SS_EN("MM/dd HH:mm:ss"),
        YYYY_MM_DD_HH_MM_EN("yyyy/MM/dd HH:mm"),
        YYYY_MM_DD_HH_MM_SS_EN("yyyy/MM/dd HH:mm:ss"),
        YYYY_MM_DD_2("yyyy.MM.dd"),

        MM_DD_CN("MM月dd日"),
        YYYY_MM_CN("yyyy年MM月"),
        YYYY_MM_DD_CN("yyyy年MM月dd日"),
        MM_DD_HH_MM_CN("MM月dd日 HH:mm"),
        MM_DD_HH_MM_SS_CN("MM月dd日 HH:mm:ss"),
        YYYY_MM_DD_HH_MM_CN("yyyy年MM月dd日 HH:mm"),
        YYYY_MM_DD_HH_MM_SS_CN("yyyy年MM月dd日 HH:mm:ss"),

        HH_MM("HH:mm"),
        HH_MM_SS("HH:mm:ss");


        private String value;

        DateStyle(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
}
